package com.example.config;

import com.example.beans.CDPlayer;
import com.example.beans.CompactDisc;
import com.example.beans.DVDPlayer;
import com.example.beans.MusicCompactDisc;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(MusicConfig.class)
public class AppConfig {

    // 声明CompactDisc bean
    // 加了@Bean注解之后，Spring将会拦截所有对compactDisc（）
    // 方法的调用，并确保直接返回该方法所创建的bean，而不是每次都
    // 对其进行实际的调用
    @Bean(name = "musicCompactDisc")
    public CompactDisc compactDisc(){
        return new MusicCompactDisc();
    }


    @Bean
    public CDPlayer cdPlayer(){
        // 看起来这里是通过直接调用compactDisc()来得到compactDisc
        // 但情况并非完全如此。因为compactDisc()方法上添加了@Bean注解，
        // Spring将会拦截所有对它的调用，并确保直接返回该方法所创建的bean，
        // 而不是每次都对其进行实际的调用
        return new CDPlayer(compactDisc());
    }

    // 上面那种通过直接调用compactDisc()方法来获取CompactDisc bean
    // 的方式容易让人感到困惑。下面这种方式效果和上面的相同，但是更容易理解：
    // 在这里，dvdPlayer()方法请求一个CompactDisc作为参数
    // 当Spring调用dvdPlayer()方法创建DVDPlayer bean的时候，它就会自动装配
    // 一个CompactDisc到配置方法中，然后方法体就可以使用它了。
    // 这种方式比较好，因为它不要求CompactDisc必须在当前配置类中配置，
    // CompactDisc bean可以通过Spring支持的方式进行声明（比如：JavaConfig方式、XML配置方式、自动扫描和装配方式）
    @Bean
    public DVDPlayer dvdPlayer(CompactDisc compactDisc){
        return new DVDPlayer(compactDisc);
    }
}
